package org.dicr.util.jds.gui;

import java.awt.event.*;
import java.net.*;

import javax.swing.*;

import org.dicr.event.*;
import org.dicr.gui.res.*;
import org.dicr.util.jds.*;

import com.borland.dx.dataset.*;

/***********************************************************************************************************************
 * @author Igor A Tarasov me@dicr.dn.ua
 * @version 030113
 **********************************************************************************************************************/
public class DataNavFilterListPanel extends DataNavPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 2724802669357494801L;

	protected DataNavFilterList navList = new DataNavFilterList();

	protected JButton delButton = this.controlPanel.getButton(DataControlPanel.BUTTON_DEL);

	protected JButton addButton = this.controlPanel.getButton(DataControlPanel.BUTTON_ADD);

	/*******************************************************************************************************************
	 * Конструктор
	 ******************************************************************************************************************/
	public DataNavFilterListPanel() {
		try {
			jbInit();
		} catch (Exception ex) {
			DicrExceptionHandler.handleException(ex, this);
		}
	}

	/*******************************************************************************************************************
	 * Инициализация
	 ******************************************************************************************************************/
	private void jbInit() {
		this.scrollPane.setViewportView(this.navList);
		this.navList.setAutoscrolls(true);
		this.addButton.setAction(null);
		this.addButton.setEnabled(false);
		this.delButton.setAction(new DelButtonAction());
		this.delButton.setEnabled(false);
	}

	/*******************************************************************************************************************
	 * Установка имени колонки навигации (переопределение)
	 ******************************************************************************************************************/
	@Override
	public void setColumnName(String theColumnName) {
		if (this.columnName != theColumnName) {
			super.setColumnName(theColumnName);
			// navList.setColumnName(columnName);
		}
	}

	/*******************************************************************************************************************
	 * Установка источника данных (переопределение)
	 ******************************************************************************************************************/
	@Override
	public void setDataSet(DataSet the_dataset) {
		if (this.dataset != the_dataset) {
			super.setDataSet(the_dataset);
			this.navList.setDataSet(the_dataset);
			updateButtons();
		}
	}

	/*******************************************************************************************************************
	 * Обработка доступа к источнику данных (переопределение)
	 ******************************************************************************************************************/
	@Override
	public void accessChange(AccessEvent e) {
		super.accessChange(e);
		updateButtons();
	}

	/*******************************************************************************************************************
	 * Обработка навигации данных (переопределение)
	 ******************************************************************************************************************/
	@Override
	public void dataChanged(DataChangeEvent e) {
		super.dataChanged(e);
		updateButtons();
	}

	/*******************************************************************************************************************
	 * Обновление состояния кнопок
	 ******************************************************************************************************************/
	protected void updateButtons() {
		boolean dataValid = isValidDataSetState();
		this.addButton.setEnabled(dataValid);
		boolean delEnabled = false;
		if (dataValid && !this.dataset.isEmpty()) {
			RowFilterListener listener = this.dataset.getRowFilterListener();
			if (listener != null && listener instanceof DataSetFilter) {
				if (((DataSetFilter) listener).getFilterValue() != null) delEnabled = true;
			}
		}
		this.delButton.setEnabled(delEnabled);
	}

	/*******************************************************************************************************************
	 * ######################################################################### Обработка событий кнопок
	 * #########################################################################
	 ******************************************************************************************************************/
	class DelButtonAction extends AbstractAction {
		/**
		 * 
		 */
		private static final long serialVersionUID = 1570174419664466604L;

		/***************************************************************************************************************
		 * Конструктор
		 **************************************************************************************************************/
		public DelButtonAction() {
			URL url = ResourceManager.class.getResource("icons/Delete24.gif");
			if (url != null) super.putValue(Action.SMALL_ICON, new ImageIcon(url));
			else super.putValue(Action.NAME, "-");
			super.putValue(Action.SHORT_DESCRIPTION, "Удалить данные с выбранным фильтром");
		}

		/***************************************************************************************************************
		 * Обработка событий
		 **************************************************************************************************************/
		@Override
        public void actionPerformed(ActionEvent e) {
			if (!isValidDataSetState()) return;
			RowFilterListener listener = DataNavFilterListPanel.this.dataset.getRowFilterListener();
			DataSetFilter filter = null;
			boolean canDelete = false;
			if ((listener != null) && (listener instanceof DataSetFilter)) {
				filter = (DataSetFilter) listener;
				if (filter.getFilterValue() != null) canDelete = true;
			}
			if (!canDelete) {
				JOptionPane.showMessageDialog(DataNavFilterListPanel.this, new String[] {
				        "Нельзя удалить сразу все записи", "Сначала выберите необходимую" }, "Ошибка удаления",
				        JOptionPane.ERROR_MESSAGE);
				return;
			}
			Object value = filter != null ? filter.getFilterValue() : null;
			String sfil = (value == null) ? "" : value.toString();
			if (JOptionPane.showConfirmDialog(DataNavFilterListPanel.this, "Удалить данные с выбранным фильтром "
			        + sfil + "?", "Удаление записей по фильтру", JOptionPane.WARNING_MESSAGE, JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) return;
			try {
				DataNavFilterListPanel.this.dataset.enableDataSetEvents(false);
				DataNavFilterListPanel.this.dataset.deleteAllRows();
				// после удаления всех элементов фильтра сбрасываем фильтр
				if (filter != null) filter.setFilterValue(null);
				DataNavFilterListPanel.this.dataset.refilter();
				DataNavFilterListPanel.this.dataset.enableDataSetEvents(true);
			} catch (Exception ex) {
				DicrExceptionHandler.handleException(ex, this, true);
			}
		}
	}
}
